#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:taotieren


"""
    rpi.gpio 需要 root 权限，板上运行需要使用
    sudo python pos_step.py
    读取调谐电位器的阻值
        10KΩ 调谐电位器，2 个 1KΩ 电阻，330nF 电容
        Pin_18 -- 1K ---- RP_1Pin
        Pin_23 -- 1K ---- RP_2Pin
                       |     RP_3Pin(NULL)
                       |
                      330nF
                       |
                       |
         GND -----------

    读数范围在 0~10000Ω 之间，实际上会有一定的误差，
    想获得更精确的读数的话，可以调整程序顶部常量 C 的值，
    同时，如果放入另一个电容的时候，即使电容标称的值相同，也要修改 C 的值。
"""

""" 非树莓派环境下可以用 rpi.gpio_def 代替 rpi.gpio 来进行程序调试和验证 """
import RPi.GPIO as GPIO
import time, math

C = 0.36  # uF
R1 = 1000  # Ohms

GPIO.setmode(GPIO.BCM)
a_Pin = 18
b_Pin = 23


def discharge():
    GPIO.setup(a_Pin, GPIO.IN)
    GPIO.setup(b_Pin, GPIO.OUT)
    GPIO.output(b_Pin, False)
    time.sleep(0.1)


def charge_time():
    GPIO.setup(b_Pin, GPIO.IN)
    GPIO.setup(a_Pin, GPIO.OUT)
    GPIO.output(a_Pin, True)
    t1 = time.time()
    while not GPIO.input(b_Pin):
        pass
    t2 = time.time()
    return (t2 - t1) * 1000000


def analog_read():
    discharge()
    t = charge_time()
    discharge()
    return t


def read_resistance():
    n = 10
    total = 0
    for i in range(1, n):
        total = total + analog_read()
    t = total / float(n)
    T = t * 0.632 * 3.3
    r = (T / C) - R1
    return r


try:
    while True:
        print(read_resistance())
        time.sleep(0.5)
finally:
    GPIO.cleanup()
